iT邦幫忙

2023 iThome 鐵人賽

DAY 24
0
自我挑戰組

解三十天的 CodeWars系列 第 24

Number of trailing zeros of N!

  • 分享至 

  • xImage
  •  

CodeWars 題目

Link

難度

5 kyu

題目

給定一個參數 n,計算給定數字 n 的階乘結果,結尾零的數量。

實作

function zeros(n) {
   let log = 1;
   let sum = 0;
   while (Math.pow(5, log) <= n) {
      sum += Math.floor(n / Math.pow(5, log));
      log++;
   }
   return sum;
}

題目中直接指出不應該實際去計算階乘,就想這或許是以數學為概念的題型。
最佳解也同樣是以數學概念實作。

根據查驗到的方法,相乘會出現零的結果,是由 2 x 5 得來的;然而 2 的倍數明顯比 5 多,所以5 是尾 0 的關鍵;也就是說計算對於 n 的階乘 n!,可以找到之中包含多少個 5。

但對於階乘來說, 5 x 2 = 10,25 ⇒ 5 x 5,也會有與 2 的倍數相乘取得尾數 0 的可能。

while 條件 Math.pow(5, log) 是否小於等於 n。

在迴圈中,將 n 除以 Math.pow(5, log) 的商,即 Math.floor(n / Math.pow(5, log));加到 sum 中。這表示將 n 中包含的 5 的個數加到總數;log++,以處理下一個 5 的次方。

返回 sum,即為 n 階乘中包含的 5 的總數,也就是末尾零的數量。

心得

以前學生時期學數學,只覺得用一堆奇怪符號實作不知道在哪裡可以用得上的公式。

但其實數學的範圍幅員遼闊,影響的產業也甚多;
甚至開始學程式之後,也覺得數學是不可或缺的基本概念。

仔細想想,打造邏輯思考跟變通能力也是數學的附加(或主要)價值吧?


上一篇
Weight for weight
下一篇
Rot13
系列文
解三十天的 CodeWars30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言